문서의 임의 삭제는 제재 대상으로, 문서를 삭제하려면 삭제 토론을 진행해야 합니다. 문서 보기문서 삭제토론 멀티코어 프로세서 (문단 편집) === 구현하려면 무엇이 필요하는가? : 지원하는 프로그래밍 언어와 라이브러리 === 멀티 코어를 이용하는 가장 기초적인 방법은 운영체제가 지원하는 스레드 생성 API를 이용해서 스레드를 생성하고, 일감 분배, 데이터 분산, 처리 및 결과값 도출을 직접 짜는 것이다. 스레드를 각 코어에 올려서 실행시켜주는 것은 운영체제의 몫이며 프로그래머의 역할은 데이터를 각 스레드별로 적절하게 분배해서 싣는 것이다. Unix 환경에서는 [[POSIX]] 스레드에서 따온 Pthread라는 멀티스레드 API 중 {{{ pthread_create }}}를 이용하여 스레드를 만들 수 있고, Windows 환경에서는 {{{ CreateThread }}} 또는 {{{ _beginthread }}}를 이용한다. 이것은 순수하게 스레드를 만들고 스레드에 일을 지정하는 역할만 하므로, 위에 나와 있는 것과 같은 작업 분배나 스레드 간의 협조 같은 수많은 작업은 온전히 프로그래머의 몫이 된다. 스레드 생성과 관리와 동기화 구현을 컴파일러가 생성하도록 하고 병렬 처리에만 집중하고 싶다면, 다시 말해서 좀 더 쉽게 구현하고 싶다면 OpenMP ARB의 OpenMP나 인텔의 스레드 빌딩 블록(TBB: Thread Building Block), MS의 병렬 패턴 라이브러리(PPL: Parallel Pattern Library) 등을 사용할 수 있다. 기존 C/C++ 문법에 directive 같은 간단한 코드를 추가해서 어떤 루프를 병렬화 할지를 알려주기만 해도 쉽게 병렬화를 할 수 있다. 물론 동기화를 어느 곳에서 해야 하는지 알려 줘야 하며, 사용할 수 있는 범위가 제한되는 제약 조건을 유의해야 한다. [[Java]], [[Python]], [[C\#]] 같은 더 고레벨 언어의 추상화된 모델을 사용한다면 각 언어가 지원하는 멀티스레딩, 멀티프로세싱 라이브러리를 사용해야 한다. 가령 파이썬 같은 경우 multiprocessing 모듈의 Process와 Queue를 사용해서 메시지 전달 패러다임을 구현할 수 있다. 만약 배열에 대한 map 연산을 각 코어에 싣고 싶다면 multiprocessing 모듈의 Pool 객체의 map 메서드를 사용하면 잔 코딩 없이도 쉽게 작업을 분배할 수 있다. 자바에서는 병렬 스트림을 구현하는 메소드인 parallel()이나 parallelStream() 등이 있으며, C#에서는 Task에서 비동기 프로그래밍을 지원하며, TPL의 Parallel 클래스를 통해 단위 작업만 지정해 주면 자동으로 최적의 스레드 숫자를 생성하여 작업배분을 해 준다. C, C++도 C11, C++11 표준부터 굳이 외부 라이브러리를 이용하지 않고도 표준 라이브러리를 통해 멀티스레딩을 구현할 수 있게 되었다. 단, 프로그래머가 병렬 프로그래밍 모델을 직접 수동으로 짜야 하는 단점이 있었으나 C++17 표준부터 일부 [[표준 템플릿 라이브러리]]([[STL]]) 함수에 병렬화를 지원하면서 C++에서도 병렬 처리를 어느 정도 간편하게 구현할 수 있게 되었다. 다만 C11, C++11에 포함된 스레드는 생성, 종료와 같은 아주 기본적인 기능만 제공하고 있으므로 Thread Affinity 와 같은 더 세밀한 컨트롤을 위해서는 Win32Thread나 POSIX Threads를 사용하여야 한다.저장 버튼을 클릭하면 당신이 기여한 내용을 CC-BY-NC-SA 2.0 KR으로 배포하고,기여한 문서에 대한 하이퍼링크나 URL을 이용하여 저작자 표시를 하는 것으로 충분하다는 데 동의하는 것입니다.이 동의는 철회할 수 없습니다.캡챠저장미리보기